package com.tedu.review.day02;

/**
 * 普通类 √
 * 抽象类 =抽象方法     关键字：abstract
 * 只有行为的概念，没有具体行为实现
 *
 * 与面向对象的多态有决对关系
 * 产生子类【实现类】同时具备实现的属性和方法
 *
 * 什么下情况时使用？
 * 复杂项目时，需要在不同类中实现，不同的功能，首先抽象类！【Android常用】
 *
 *  定义抽象类？
 *  修饰符 abstract class 类名{}   抽象类本身没有任何意义
 *  创建抽象类同时必须存在抽象方法：
 *  修饰符 abstract 返回值 方法名();  定义抽象方法，提供给子类使用
 *
 *  抽象类的实例化：
 *  必须使用多态，向上造型，自身无法实例化，子类【实现类】
 *
 *  定义③   使用 ①  注意②
 * 抽象类使用注意：抽象类和抽象方法必须使用abstract关键字修饰
 *             可以定义静态属性，静态方法需要加空{}（代码块），不可以定义抽象属性
 *             可以存在构造器，不可以定义静态抽象方法，不可以抽象静态属性
 *             可以存在内部类：静态内部类，抽象类继承抽象类
 *             Java只允许单继承，实现值需要继承子抽象类
 *             final不能修饰抽象方法
 */
abstract class Animals{ //①可以使用static修饰
    //类定义：  修饰符【abstract |static（只能二选一不能同时运行*没有静态抽象类*）】class 类名{}
    public abstract void say();//抽象方法：没有任何实现
    //②定义修饰final[锁死]的抽象方法  ×  final不能修饰抽象方法
    //public final abstract void sleep();
    //③定义抽象属性 错|定义静态属性 对    抽象类无法定义抽象属性但是能定义静态属性
    // abstract int i;
    static int i;//声明未赋值
    //④定义抽象静态属性  ×
   // abstract static int j;             抽象类不存在---
    //⑤定义一个静态抽象方法 × 语法：修饰符【static abstract】返回值 方法名
    //public static abstract void eat();
    //⑥定义一个静态方法 √ 需要加代码块{}一定空（抽象方法不用加{}）  实现类（子类）不需要一定实现
    public static void eat(){}
    //⑦可以存在内部类,可以存在静态内部类
    public static class Sos{}
    //⑧抽象类存在构造器--抽象类构造器 【其他类不存在】

    public Animals() {
    }

}
//⑨抽象类可以继承抽象类   1+1=2效果
abstract class Thing extends Animals{
    //成员变量
    protected abstract int result();
}
//⑩实现类（子类）不可以继承两抽象类*【java为单继承】*但是，实现最终继承【子】抽象类

//实现类：子类  继承 抽象类 完成：抽象类方法
class People extends Animals{

    @Override
    public void say() {
        System.out.println("人---说话");
    }
}
//实现类:假设 Animals  有俩抽象方法  请问：子类需要实现抽象类全部抽象方法
class Monkey extends Animals{
    public void say(){
        System.out.println("猴--说话");
    }
}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象---实例化【创建对象】---多态：向上造型
        Animals a=new People();
        a.say();  //输出：重写后的值  【方法互通】
        //实现抽象类实例化
        Animals a1=new Monkey();
        a1.say();
    }
}
